// 导入express 模块
const express = require('express')
// 创建 express 服务器实例
const app = express()

// 1．导入用于生成JT字符串的包
const jwt = require('jsonwebtoken')
// 2．导入用于将客户端发送过来的JWT字符串，解析还原成JSON对象的包
const expressJWT = require('express-jwt')

const bodyParser = require('body-parser')
app.use(bodyParser.urlencoded({extended:false}))

// 3. secret密钥的本质:就是一个字符串 建议命名为secretkey
const secretKey = 'itheima No1 A_A'

// TODO_04:注册将JWT字符串解析还原成JSON对象的中间件
// 使用app.use(）来注册中间件
// expressJWT({ secret: secretKey })就是用来解析Token的中间件
// .unless({ path: [/^\/api1//]}）用来指定哪些接口不需要访问权限
// 注意;只要配置成功了express-jwt 这个中间件，就可以把解析出来的用户信息，挂载到 req.user属性上
app.use(expressJWT({ 
    secret: secretKey, 
    algorithms:[
        'HS256',
        // 'RS256',
    ],
    // credentialsRequired:false,  // false 不校验
    // requestProperty: 'auth'
}).unless({ 
    path: [/^\/api\//] 
}))


// 登录按口
app.post('/api/login', (req,res)=> { 
    // 将 req.body 请求体中的数据,转存为userinfo常量
    const userinfo = req.body
    // 登陆失败
    if(userinfo.username !== 'admin' || userinfo.password !== '123456'){
        return res.send({
            status:400,
            message:'登陆失败',
        })
    }
    // TOD0_03:在登录成功之后，调用 jwt.sign()方法生成JWT字符串。并通过 token属性发送给客户端
    // 参数1:用户的信息对象
    // 参数2:加密的秘钥
    // 参数3:配置对象,可以配置当前token 的有效期
    const tokenStr = jwt.sign({ username: userinfo.username },secretKey,{expiresIn: "300s"})
    res.send({
        status: 200,
        message:"登录成功!",
        // 调用jwt,sign()生成MT字符串。三个参效分影是;用户信息对象。加N密明、配面对象
        token: tokenStr, // 要发送给客户端的 token字符串
    })
})

// 这是一个有权限的 API 接口
app.get('/admin/getinfo',function(req,res){
    // TODO_05:使用req.user 获取用户信息，并使用 data属性将用户信息发送给客户端
    console.log(req.user);
    res.send({
        status:200,
        message:'获取用户信息成功',
        data:req.user,// 要发送给客户端的用户信息
    })
})

// TODO_06:使用全局错误处理中间件，捕获解析JWT 失败后产生的错误
app.use((err,req,res,next)=>{
    // token 解析失败导致的错误
    if(err.name === 'UnauthorizedError'){
        return res.send({status:401,message:'无效的token'})
    }
    // 其他原因导致的错误
    res.send({status:500,message:'未知错误'})
})

// 启动web服务器
app.listen(80,()=>{
    console.log('express server running at http://127.0.0.1:80');
})